home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
new_file
/
falcon
/
dsppaula
/
dsppaula.lzh
/
ice_unp2.s
< prev
next >
Wrap
Text File
|
1993-05-21
|
3KB
|
180 lines
;********************************************* Unpacking routine of PACK-ICE
; a0 = Adress of packed data
; "bsr" or "jsr" to ice_decrunch_2 with register a0 prepared.
ice_decrunch_2:
link a3,#-120
movem.l d0-a6,-(sp)
lea 120(a0),a4
move.l a4,a6
bsr .getinfo
cmpi.l #'ICE!',d0
bne .not_packed
bsr.s .getinfo
lea.l -8(a0,d0.l),a5
bsr.s .getinfo
move.l d0,(sp)
adda.l d0,a6
move.l a6,a1
moveq #119,d0
.save: move.b -(a1),-(a3)
dbf d0,.save
move.l a6,a3
move.b -(a5),d7
bsr.s .normal_bytes
move.l a3,a5
bsr .get_1_bit
bcc.s .no_picture
move.w #$0f9f,d7
bsr .get_1_bit
bcc.s .ice_00
moveq #15,d0
bsr .get_d0_bits
move.w d1,d7
.ice_00: moveq #3,d6
.ice_01: move.w -(a3),d4
moveq #3,d5
.ice_02: add.w d4,d4
addx.w d0,d0
add.w d4,d4
addx.w d1,d1
add.w d4,d4
addx.w d2,d2
add.w d4,d4
addx.w d3,d3
dbra d5,.ice_02
dbra d6,.ice_01
movem.w d0-d3,(a3)
dbra d7,.ice_00
.no_picture
movem.l (sp),d0-a3
.move move.b (a4)+,(a0)+
subq.l #1,d0
bne.s .move
moveq #119,d0
.rest move.b -(a3),-(a5)
dbf d0,.rest
.not_packed:
movem.l (sp)+,d0-a6
unlk a3
rts
.getinfo: moveq #3,d1
.getbytes: lsl.l #8,d0
move.b (a0)+,d0
dbf d1,.getbytes
rts
.normal_bytes:
bsr.s .get_1_bit
bcc.s .test_if_end
moveq.l #0,d1
bsr.s .get_1_bit
bcc.s .copy_direkt
lea.l .direkt_tab+20(pc),a1
moveq.l #4,d3
.nextgb: move.l -(a1),d0
bsr.s .get_d0_bits
swap.w d0
cmp.w d0,d1
dbne d3,.nextgb
.no_more: add.l 20(a1),d1
.copy_direkt:
move.b -(a5),-(a6)
dbf d1,.copy_direkt
.test_if_end:
cmpa.l a4,a6
bgt.s .strings
rts
.get_1_bit:
add.b d7,d7
bne.s .bitfound
move.b -(a5),d7
addx.b d7,d7
.bitfound:
rts
.get_d0_bits:
moveq.l #0,d1
.hole_bit_loop:
add.b d7,d7
bne.s .on_d0
move.b -(a5),d7
addx.b d7,d7
.on_d0: addx.w d1,d1
dbf d0,.hole_bit_loop
rts
.strings: lea.l .length_tab(pc),a1
moveq.l #3,d2
.get_length_bit:
bsr.s .get_1_bit
dbcc d2,.get_length_bit
.no_length_bit:
moveq.l #0,d4
moveq.l #0,d1
move.b 1(a1,d2.w),d0
ext.w d0
bmi.s .no_über
.get_über:
bsr.s .get_d0_bits
.no_über: move.b 6(a1,d2.w),d4
add.w d1,d4
beq.s .get_offset_2
lea.l .more_offset(pc),a1
moveq.l #1,d2
.getoffs: bsr.s .get_1_bit
dbcc d2,.getoffs
moveq.l #0,d1
move.b 1(a1,d2.w),d0
ext.w d0
bsr.s .get_d0_bits
add.w d2,d2
add.w 6(a1,d2.w),d1
bpl.s .depack_bytes
sub.w d4,d1
bra.s .depack_bytes
.get_offset_2:
moveq.l #0,d1
moveq.l #5,d0
moveq.l #-1,d2
bsr.s .get_1_bit
bcc.s .less_40
moveq.l #8,d0
moveq.l #$3f,d2
.less_40: bsr.s .get_d0_bits
add.w d2,d1
.depack_bytes:
lea.l 2(a6,d4.w),a1
adda.w d1,a1
move.b -(a1),-(a6)
.dep_b: move.b -(a1),-(a6)
dbf d4,.dep_b
bra .normal_bytes
.direkt_tab:
dc.l $7fff000e,$00ff0007,$00070002,$00030001,$00030001
dc.l 270-1,15-1,8-1,5-1,2-1
.length_tab:
dc.b 9,1,0,-1,-1
dc.b 8,4,2,1,0
.more_offset:
dc.b 11,4,7,0 ; Bits lesen
dc.w $11f,-1,$1f ; Standard Offset
ende_ice_decrunch_2:
;************************************************** end of unpacking routine